#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>

// 文件描述符分配规则：fd_array中，没有指向文件的最小数组下标
int main() {
    int cnt = 5;
    close(1);
    int fd = open("bite", O_CREAT | O_WRONLY | O_TRUNC, 0666);
    fprintf(stderr, "%d\n", fd);
    if (-1 == fd) {
        perror("open");
        return errno;
    }
    const char* msg = "hello linux\n";
    while (cnt) {
        // write(1, msg, strlen(msg));
        printf("%s", msg); 
        // 在程序开始，关闭了显示器文件，之后打开新文件后，新文件的描述符是1
        // C语言的标准输出流 stdout 中的文件描述符是1
        // 所以标准输出函数 printf 在程序中是向普通文件写，缓冲区刷新规则是填满刷新
        // 如果不刷新，程序结束后，因为直接调用 close 关闭文件，所以没有刷新流 stdout 对应的缓冲区
        // bite 文件就为空
        cnt--;
    }
    
    // 在这里，如果我不关fd，也不刷新，会发生什么？-> 会向文件中写：C语言程序结束时，会关闭打开的三个流，从而刷新对应缓冲区
    // fflush(stdout); 
    close(fd); 
    // 为什么在这里关闭fd，就不会往文件中写了? 
    // -> 因为在文件开始，指向显示器文件的文件描述符被关闭了。新分配的文件描述符是1。
    // 在这里使用close是操作系统关闭了该文件描述符，不会刷新C语言分配的缓冲区
    // 即使在程序结束时会刷新相应流的缓冲区，但是该流对应的文件描述符早已关闭，所以不会给文件中写。
    return 0;
}





// 课后作业

// int main() {
//     int fd = open("bite", O_WRONLY | O_CREAT | O_TRUNC, 0666);
//     if (-1 == fd) {
//         perror("open");
//         return errno;
//     }
//     const char* msg = "i like linux!";
//     write(fd, msg, strlen(msg));
// 
//     int fd2 = open("bite", O_RDONLY);
//     if (-1 == fd2) {
//         perror("open");
//         return errno;
//     }
//     char buffer[1024] = { 0 };
//     read(fd2, buffer, 1023);
//     write(1, buffer, strlen(buffer));
// 
//     return 0;
// }

// 熟悉IO系统调用

// 读文件
// int main() {
//     int fd = open("bite", O_RDONLY);
//     if (-1 == fd) {
//         perror("open");
//         return errno;
//     }
//     printf("the file has opened!!!\n");
//     printf("begin sleep\n");
//     int count = 20;
//     while (count) {
//         printf("%-2d", count--); // 回车可以移动光标，但不能刷新缓冲区
//         fflush(stdout);
//         sleep(1);
//         printf("\r");
//     }
//     fflush(stdout);
//     char buffer[1024] = { '\0' };
//     read(fd, buffer, 1023);
//     int ret = write(1, buffer, strlen(buffer));
//     if (-1 == ret) {
//         close(fd);
//         perror("write");
//         return 1;
//     }
//     close(fd);
//     return 0;
// }



// 写文件

// int main() {
//     umask(0000);
//     int fd = open("bite", O_WRONLY | O_CREAT | O_TRUNC, 0666); // 相当于C语言中以'w'模式打开
//     // int fd = open("bite", O_WRONLY | O_CREAT | O_APPEND, 0666); // 相当于C语言中以'a'模式打开
//     if (-1 == fd) {
//         perror("open");
//         return -1;
//     } 
//     printf("the file has opened!!!\n");
//     printf("begin sleep\n");
//     int count = 20;
//     while (count) {
//         printf("%-2d", count--); // 回车可以移动光标，但不能刷新缓冲区
//         fflush(stdout);
//         sleep(1);
//         printf("\r");
//     }
//     printf("begin write\n");
//     const char* msg = "i like linux!\n";
//     count = 5;
//     while (count--) {
//         write(fd, msg, strlen(msg));
//     }
//     close(fd);
//     return 0;
// }
